layout.tsx 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import clsx from "clsx";
  2. import { Viewport } from "next";
  3. import { NextIntlClientProvider } from "next-intl";
  4. import { getMessages } from "next-intl/server";
  5. import { Inter as FontSans } from "next/font/google";
  6. import { ReactNode } from "react";
  7. import Head from "next/head";
  8. import "../globals.css";
  9. import PageTransitionEffect from "@/components/PageTransitionEffect";
  10. import { Providers } from "./providers";
  11. // 加载字体
  12. const fontSans = FontSans({
  13. subsets: ["latin"],
  14. variable: "--font-sans",
  15. });
  16. export const viewport: Viewport = {
  17. themeColor: [
  18. { media: "(prefers-color-scheme: light)", color: "white" },
  19. { media: "(prefers-color-scheme: dark)", color: "black" },
  20. ],
  21. };
  22. export default async function LocaleLayout({
  23. children,
  24. params: { locale },
  25. }: {
  26. children: ReactNode;
  27. params: { locale: string };
  28. }) {
  29. const messages = await getMessages();
  30. return (
  31. <html lang={locale} suppressHydrationWarning>
  32. <Head>
  33. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  34. <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover" />
  35. <meta name="keywords" content=""/>
  36. <meta name="description" content=""/>
  37. <meta http-equiv="Cache-control" content="no-cache, no-store, must-revalidate"/>
  38. <meta http-equiv="Pragma" content="no-cache"/>
  39. <meta http-equiv="Expires" content="0"/>
  40. <meta name="apple-mobile-web-app-status-bar-style" content="black" />
  41. <meta name="format-detection" content="telphone=no, email=no" />
  42. <meta name="viewport" content="viewport-fil=cover" />
  43. </Head>
  44. <body className={clsx("font-sans", fontSans.variable)}>
  45. <Providers themeProps={{ defaultTheme: "dark", attribute: "class" }}>
  46. <NextIntlClientProvider messages={messages}>
  47. <PageTransitionEffect>{children}</PageTransitionEffect>
  48. </NextIntlClientProvider>
  49. </Providers>
  50. </body>
  51. </html>
  52. );
  53. }